package com.source.lightfowl.basedata.service.impl;

import com.source.lightfowl.basedata.dao.BarcodeMachineDao;
import com.source.lightfowl.basedata.dao.BarcodeMachineStatusDao;
import com.source.lightfowl.basedata.dao.SlaughterHouseDao;
import com.source.lightfowl.basedata.entity.*;
import com.source.lightfowl.basedata.service.BarcodeMachineChartService;
import com.source.lightfowl.basedata.service.StallsService;
import com.source.lightfowl.person.dao.PersonDao;
import com.source.lightfowl.person.entity.Person;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.lang.reflect.Array;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;

/**
 * @Description:
 * @Author: Faink
 * @CreateTime: 2020/9/12 19:53
 */
@Service
public class BarcodeMachineChartServiceImpl implements BarcodeMachineChartService {
    @Autowired
    private BarcodeMachineStatusDao barcodeMachineStatusDao;
    @Autowired
    private BarcodeMachineDao barcodeMachineDao;
    @Autowired
    private SlaughterHouseDao slaughterHouseDao;

    @Autowired
    private PersonDao personDao;
    @Autowired
    private StallsService stallsService;

    //根据id查询设备的状态
    @Override
    public List<MachineStatusList> getMsgById(Integer id) {

        //ArrayList<Barcode_Machine_Status> all = barcodeMachineStatusDao.findBySlaughterHouseId(id);
        //1. 查询这个市场的脚标机  即查询脚标机中 市场id等于参数
        List<BarcodeMachine> all = barcodeMachineDao.finBySlaughterHouseId(id + "");


        if (null == all || all.size() == 0) return new ArrayList<>();

        //2.用脚标机的id去状态表查询 状态 判断状态之后加入分类数组 返回结果
        //2.1 创建分类数组 存放判断的结果
        ArrayList<Barcode_Machine_Status> list0 = new ArrayList<>(); //离线
        ArrayList<Barcode_Machine_Status> list1 = new ArrayList<>(); //正常
        ArrayList<Barcode_Machine_Status> list2 = new ArrayList<>(); //卡纸
        ArrayList<Barcode_Machine_Status> list3 = new ArrayList<>(); //缺纸


        //2.2 查询状态 保存到分类结果
        for (BarcodeMachine s : all) {
            String id1 = s.getId();

            /*
            11.4 版本 这一步需要修改 修改为返回最新时间的记录
             */
            //Barcode_Machine_Status res = barcodeMachineStatusDao.getByBarchodeMachineId(id1);
            //调用一个新的接口 查询最新的一条数据
            Barcode_Machine_Status res = getRecentByBarchodeMachineId(id1); //

            String state = res.getState();

            //to do 7.添加档口名（等待补充） 联系人(userId -> name) 联系方式(phone)
            //Person person = personDao.findPersonById(s.getUserId());
            Optional<Person> o = personDao.findById(s.getUserId());
            Person person = o.get();
            res.setStallsName(stallsService.findById(Integer.valueOf(s.getStallsId())).get().getStallsName()); //档口名
            res.setLinkman(person.getName()); //联系人
            res.setPhome(person.getPhone()); //联系方式

            //下面的多行数据是测试版本用的判断状态 在控制台打印了状态为nul的信息
            if (state != null) {
                if (state.equals("2")) { //卡纸
                    list2.add(res);
                } else if (state.equals("3")) { //缺纸
                    list3.add(res);
                } else if (state.equals("1")) { //正常
                    list1.add(res);
                } else if (state.equals("0")) { //离线
                    list0.add(res);
                }
            }else {
                //输出数据库不一致信息
                System.out.println("========= success ========");
                System.out.println("查询最新的一条数据出错："+res);
                System.out.println("barcodemachimeId"+id1);
                System.out.println("========= success ========");
            }
            //下面的是线上的版本
            /*if (state.equals("2")) { //卡纸
                list2.add(res);
            } else if (state.equals("3")) { //缺纸
                list3.add(res);
            } else if (state.equals("1")) { //正常
                list1.add(res);
            } else if (state.equals("0")) { //离线
                list0.add(res);
            }*/
        }

        //to do 5.对缺纸的那一组进行排序 十月中旬的版本修改
        List<Barcode_Machine_Status> list33 = list3.stream().sorted((o1, o2) -> {
            //根据纸张剩余量排序
            return o1.getBarcodeSurplus() - o2.getBarcodeSurplus();
        }).collect(Collectors.toList());

        //System.out.println(mylist2.toString());
        MachineStatusList mylist0 = new MachineStatusList(list0, "离线");
        MachineStatusList mylist1 = new MachineStatusList(list1, "正常");
        MachineStatusList mylist2 = new MachineStatusList(list2, "卡纸");
        MachineStatusList mylist3 = new MachineStatusList(list33, "缺纸");


        List<MachineStatusList> result = new ArrayList<>();
        result.add(mylist0);
        result.add(mylist1);
        result.add(mylist2);
        result.add(mylist3);
        return result;
    }

    public Barcode_Machine_Status getRecentByBarchodeMachineId(String id1) {
        List<Barcode_Machine_Status> all = barcodeMachineStatusDao.getRecentByBarchodeMachineId(id1);

        List<Barcode_Machine_Status> collect = all.stream().sorted((o1, o2) -> {

            // 默认降序, 升序的话 把 dt1 和 dt2 调换位置
            return Long.compare(o2.getOfflineTime().getTime(), o1.getOfflineTime().getTime());

        }).collect(Collectors.toList());


        if (collect.isEmpty()) {
            //throw new RuntimeException("排序异常");
            return new Barcode_Machine_Status();
        } else {
            return collect.get(0);
        }
    }


    @Override
    public MachineStatusList getMsgByIdAndStatus(Integer id, String status) {
        //ArrayList<Barcode_Machine_Status> all = barcodeMachineStatusDao.findBySlaughterHouseId(id);
        //1. 查询这个市场的脚标机  即查询脚标机中 市场id等于参数
        List<BarcodeMachine> all = barcodeMachineDao.finBySlaughterHouseId(id + "");

        if (null == all || all.size() == 0) return null;

        //2.用脚标机的id去状态表查询 状态 判断状态之后加入分类数组 返回结果
        //2.1 创建分类数组 存放判断的结果
        ArrayList<Barcode_Machine_Status> list0 = new ArrayList<>(); //


        //内部类自封装，统计Arraylist的size即得到各状态的设备数量

        //2.2 查询状态 保存到分类结果
        for (BarcodeMachine s : all) {
            //获取脚标机id  然后去状态表w
            String id1 = s.getId();
            Barcode_Machine_Status res = barcodeMachineStatusDao.getByBarchodeMachineId(id1);
            String state = res.getState();
            if (state.equals(status)) { //卡纸

                //to do 7.添加档口名（等待补充） 联系人(userId -> name) 联系方式(phone)
                //Person person = personDao.findPersonById(s.getUserId());
                Optional<Person> o = personDao.findById(s.getUserId());
                Person person = o.get();

                //=====================10_3
                String stallsId = s.getStallsId();
                Integer integer = Integer.valueOf(stallsId);
                Optional<Stalls> optional = stallsService.findById(integer);
                if (optional.isPresent()) {
                    res.setStallsName(optional.get().getStallsName()); //档口名
                }
                //.get().getStallsName();

                res.setLinkman(person.getName()); //联系人
                res.setPhome(person.getPhone()); //联系方式

                list0.add(res);
            }


        }

        //to do 5.纸张排序 十月中旬的版本修改
        List<Barcode_Machine_Status> list33 = list0.stream().sorted((o1, o2) -> {
            //根据纸张剩余量排序
            return o1.getBarcodeSurplus() - o2.getBarcodeSurplus();
        }).collect(Collectors.toList());

        //System.out.println(mylist2.toString());
        MachineStatusList mylist0 = new MachineStatusList(list33, status);


        return mylist0;

    }



    /*class MachineStatusList{
        ArrayList<Barcode_Machine_Status> list;
        int size;
        MachineStatusList(){}
        MachineStatusList(ArrayList<Barcode_Machine_Status> list) {
            this.list = list;
            this.size = list.size();
        }
    }*/
}
